// RUN: %target-typecheck-verify-swift
// RUN: %target-typecheck-verify-swift -enable-testing

@_versioned private func privateVersioned() {}
// expected-error@-1 {{'@_versioned' attribute can only be applied to internal declarations, but 'privateVersioned' is private}}

@_versioned fileprivate func fileprivateVersioned() {}
// expected-error@-1 {{'@_versioned' attribute can only be applied to internal declarations, but 'fileprivateVersioned' is fileprivate}}

@_versioned internal func internalVersioned() {}
// OK

@_versioned func implicitInternalVersioned() {}
// OK

@_versioned public func publicVersioned() {}
// expected-error@-1 {{'@_versioned' attribute can only be applied to internal declarations, but 'publicVersioned' is public}}

internal class internalClass {
  @_versioned public func publicVersioned() {}
  // expected-error@-1 {{'@_versioned' attribute can only be applied to internal declarations, but 'publicVersioned' is public}}
}

fileprivate class filePrivateClass {
  @_versioned internal func internalVersioned() {}
}

@_versioned struct S {
  var x: Int
  @_versioned var y: Int
}

@_versioned extension S {}
// expected-error@-1 {{@_versioned cannot be applied to this declaration}}

@_versioned
protocol VersionedProtocol {
  associatedtype T

  func requirement() -> T

  public func publicRequirement() -> T
  // expected-error@-1 {{'public' modifier cannot be used in protocols}}

  @_versioned func versionedRequirement() -> T
  // expected-error@-1 {{'@_versioned' attribute cannot be used in protocols}}
}
